package Controller;

import java.io.File;
import java.io.IOException;
import java.net.UnknownHostException;
import java.text.*;
import java.util.*;
import ourMessage.*;
import ChatNI.ChatNI;
import chatGUI.ChatGui;
import Model.*;
import java.awt.Color;
import java.net.InetAddress;
import static java.net.InetAddress.getLocalHost;
import java.text.DateFormat;
import java.util.*;

/**
 *
 * @author Ridiss
 */
public class ChatController {
    
        private static final boolean from = true;
        private static final boolean to = false;

    /**
     * @return the filename
     */
    public static String getFilename() {
        return filename;
    }

    /**
     * @param aFilename the filename to set
     */
    public static void setFilename(String aFilename) {
        filename = aFilename;
    }

    /**
     * @return the sizeFile
     */
    public static long getSizeFile() {
        return sizeFile;
    }

    /**
     * @param aSizeFile the sizeFile to set
     */
    public static void setSizeFile(long aSizeFile) {
        sizeFile = aSizeFile;
    }
        
        private  boolean isConnected ;
        private static ChatGui chatGui;
        private static ChatNI chatNi;
        private  ChatNI Ni;
        private static ChatModel chatModel;
        private  String localUsername;
        private static  String localUsername1;
        private InetAddress ipadd;
        private int isDemand=0;
        private final boolean isAccept=true;
        private static  int portClient=2015;
        private static File fileaTrans;
        private static String filename;
        private static long sizeFile;
        private static Date heure=new Date();

    /**
     * @return the fileaTrans
     */
        
         public static File getFileaTrans() {
            return fileaTrans;
        }

    /**
     * @return the localUsername1
     */
        public static String getLocalUsername1() {
             return localUsername1;
        }

    /**
     * @param aLocalUsername1 the localUsername1 to set
     */
        public static void setLocalUsername1(String aLocalUsername1) {
            localUsername1 = aLocalUsername1;
        }

    /**
     *Construrcteur de la classe,il est appelé dans la fonction qui lance le logiciel.
     * 
     * @param chatGui
     * @param chatNi
     * @param chatModel
     */
    public ChatController(ChatGui chatGui, ChatNI chatNi, ChatModel chatModel) {
                // TODO Auto-generated constructor stub
                isConnected = false;
                this.chatGui = chatGui;
                this.chatNi = chatNi;
                this.chatModel = chatModel;
                localUsername = null;
               
        }
        
        
    /**
     * @return the localUsername
     */
        public  String getLocalUsername() {
            return localUsername;
        }

    /**
     * @param aLocalUsername the localUsername to set
     */
        public void setLocalUsername(String aLocalUsername) {
            localUsername = aLocalUsername;
        }
        
        /**
         * @return the isConnected
         */
        public boolean isConnected() {
                return isConnected;
        }
        //

    /**
     *
     * Appelé quand reçoit un bye. Cette méthode permet de notifier au model de supprimer un utilisateur 
     * et de notifier la vue en même temps
     * 
     * @param message
     */
            public static void byeProcessing(Bye message){
               System.out.println("On a reçu un bye " + message);
                       chatModel.removeUser(message.getUsername());
       }
         
        //

    /**
     * Appelé quand reçoit un hello.
     * elle permet d'ajouter l'utilisateur en passant le nom de l'utilisateur en argument
     * et aussi envoyer un Ack ou un hello en fonction de l'état dans lequel on est.
     * 
     * @param message
     * @throws UnknownHostException
     */
            public static void helloProcessing(Hello message) throws UnknownHostException{
            
                if(message.isAck()){
                        System.out.println("On a recu un ack " + message);
                        
                        chatModel.addUser(message.getlogin());
                
                        
                        
                }else{
                        System.out.println("On a recu un hello" + message);
                        
                        chatModel.addUser(message.getlogin());
                        //on envoie ici un acquittement, avec isAck à true
                        chatNi.SendHello(true,message.getlogin());     
                }
               
        }
        
        

    /**
     *Appelé quand on veut envoyer un msg
     * 
     * @param txt
     * @param UsernameList
     */
            public void perfomSendMessage(String txt, List UsernameList){
            Text m = new Text(localUsername, txt, true);
            DateFormat formateDate=new SimpleDateFormat("HH':'mm");
            System.out.println("0n envoie un message");
            chatNi.SendMessage(m, UsernameList);
            String send0;
            send0 = "["+formateDate.format(heure)+"] "+ "Moi"+": "+m.getText()+ "\n";
            
            chatGui.setRecption(send0);
        }
        
        

    /**
     *Appelé quand on reçoit un msg. Cette méthode permet notifier la vue à la réception d'un message. 
     * 
     * @param message
     */
             public static void messageProcessing(Text message){
              System.out.println("On a recu un message: " + message);
              DateFormat formateDate=new SimpleDateFormat("HH':'mm");
              String send;
              String[] name=message.getlogin().split("@");
              send = "["+formateDate.format(heure)+"] "+  name[0]+": "+message.getText()+ "\n";

              chatGui.setRecption(send);
               
        }
         
      

    /**
     *
     * Appelé quand on reçoit un fichier
     * 
     * @param message
     */
            public static void fileProcessing(FilePart message){
                System.out.println("On a recu un bout de File : " + message.toString());
                chatGui.setRecption("Fichier reçu et enregistré");
                chatGui.setPrgbar(100);
                chatGui.setPourcent("100%");
        }

         

    /**
     *Appelé quand on envoie une demande de transfert de fichier
     * 
     * 
     * @param file
     * @param fileName
     * @param sizeFile
     * @param UsernameList
     */
            public void perfomSendFileDemand(File file,String fileName, long sizeFile,List UsernameList){
            fileaTrans=file;
            isDemand++;
            System.out.println("On envoie une demande de transfert de fichier");
            chatNi.SendFileDemand(localUsername, fileName, sizeFile, portClient, isDemand,UsernameList);
        }
    
        

    /**
     * Appelé quand on envoie une confirmation de transfert de fichier
     * 
     * @param UsernameList
     * @throws IOException
     */
            public void performTransfertConfirmation(List UsernameList) throws IOException{
            System.out.println("On envoie une confirmation de transfert de fichier");
            chatNi.TransfertConfirmation(localUsername, isAccept, isDemand, UsernameList);
            
            chatGui.setNoBt(false);
            chatGui.setYesBt(false);
        }
        
        //appelé quand on reçoit une demande de transfert de fichier

    /**
     *
     * @param msg
     */
            public static void sendfiledemandProcessing(FileTransfertDemand msg){
            
            System.out.println("Demande de transfert de fichier de : "+msg);
            ChatController.filename=msg.getName();
            ChatController.setSizeFile(msg.getSize());
            chatGui.setRecption(msg.toString() +"\n");
            
            chatGui.setNoBt(true);
            chatGui.setYesBt(true);
        }
        
        
         // appelé quand on envoie un rejet de transfert de fichier

    /**
     *
     * @param UsernameList
     */
            public void performTransfertCancel(List UsernameList){
            System.out.println("On envoie un rejet de transfert de fichier");
            chatNi.TransfertCancel(localUsername,isDemand,UsernameList);
        }
       

    /**
     *Appélé lorsqu'on recoit un cancel, avec comme paramètre le nom du destinataire
     * 
     * 
     * @param l
     */
            public static void perfomcanceling(String l){
            chatGui.setRecption(l+" à réfuser le transfère. \n");
        }
        
        
        

    /**
     *Appelé pour un transfert de fichier par l'utilisateur local.
     * 
     */
            public static  void performTransfertFile(){
             
                try {  
                        ChatNI.SendFile(localUsername1, fileaTrans, portClient);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }   
        }
    
     
        //appelé quand on veut se connecter.

    /**
     *
     * @throws UnknownHostException
     */
            public void performConnect() throws UnknownHostException{
               
                Ni=new ChatNI();
                Ni.SendHello(false,null);
               
               
        }
        
        //appelé quand on veut se déconnecter.

    /**
     *
     * @throws UnknownHostException
     */
            public void performDisconnect() throws UnknownHostException{
                isConnected = false;
                chatNi.SendBye();
        }
      
        /**
         * @return the chatNi
         */
        public ChatNI getChatNi() {
                return chatNi;
        }

        /**
         * @param chatNi the chatNi to set
         */
        public void setChatNi(ChatNI chatNi) {
               chatNi = chatNi;
        }


    /**
     * @return the ipadd
     * @throws java.net.UnknownHostException
     */
        public InetAddress getIpadd() throws UnknownHostException {
             return ipadd= getLocalHost();
        }

    /**
     * @return the chatGui
     */
    public ChatGui getChatGui() {
        return chatGui;
    }

   

        
        
}